package com.java复习.jdbc.学生管理系统;


import java.sql.*;
import java.util.Scanner;

public class MainTest {

    // 主方法
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        MainTest m = new MainTest();//实例化当前类的对象，调用其他成员方法
        Scanner sc = new Scanner(System.in);
        while(true) {
            int ch = m.menu();//调用菜单选项，获取用户的选择
            switch(ch) {//使用Switch结构根据用户输入执行不同功能
                case 1:
                    m.SelectAll();
                    break;//查询所有信息
                case 2:
                    System.out.println("请输入需要添加的学生的数量：");
                    int n = sc.nextInt();
                    int countInsert = m.insertStudent(n);//获取插入成功的数据行数
                    //如果插入成功行数与用户输入相等，则表示成功。还有事务回滚和提交操作没有实现，感兴趣的朋友可以自行添加实现这个功能。
                    if(countInsert==n) {
                        System.out.println("学生信息添加成功!");
                    }else {
                        System.out.println("信息输入有误，学生添加失败。");
                    }
                    break;
                case 3:
                    System.out.println("请输入需要修改的学生的学号：");
                    String IDUpdate= sc.next();
                    int countUpdate = m.updateStudent(IDUpdate);
                    if(countUpdate==1) {//学号唯一，一个学号对应一条数据
                        System.out.println("学生信息修改成功。");
                    }
                    break;
                case 4:
                    System.out.println("请输入需要删除的学生的学号：");
                    String IDDelete = sc.next();
                    int countDelete = m.deleteStudentByID(IDDelete);
                    if(countDelete==1) {
                        System.out.println("删除成功。");
                    }else {
                        System.out.println("删除失败。");
                    }
                    break;
                case 5:
                    System.out.println("请输入学生姓名：");
                    String name = sc.next();
                    m.Select(name);
                    break;
                case 6:
                    System.out.println("感谢使用，系统退出中......");
                    System.exit(0);//退出执行
                default:
                    System.err.println("请选择相应的功能......");
            }
            System.out.println("请输入回车键继续......");
            sc.nextLine();
        }
    }



    // 菜单
    public int menu() {
        Scanner sc = new Scanner(System.in);
        System.out.println("****************学生信息管理系统****************");
        System.out.println("\t\t1、查询学生信息。");
        System.out.println("\t\t2、添加学生信息。");
        System.out.println("\t\t3、修改学生信息。");
        System.out.println("\t\t4、删除学生信息。");
        System.out.println("\t\t5、查询单个学生信息。");
        System.out.println("\t\t6、退出系统。");
        System.out.println("请选择你需要的功能：");
        return sc.nextInt();
    }


    // 连接数据库
    public Connection getConnection() throws SQLException, ClassNotFoundException {
        String Driver = "com.mysql.cj.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/stu?serverTimezone=GMT%2B8";
        String user="root";
        String pwd="ljh990124";
        Class.forName(Driver);//加载驱动
        Connection con = DriverManager.getConnection(url,user,pwd);//建立连接
        if(con.isClosed()) {
            System.err.println("数据库连接失败。");
            return null;
        }else {
            System.out.println("连接成功。");
            return con;
        }
    }



    // 查询所有学生数据
    public void SelectAll() throws ClassNotFoundException, SQLException {
        Connection con = getConnection();//调用getConnection()方法获取数据库连接对象
        PreparedStatement ps = con.prepareStatement("select * from Student");//创建预处理对象执行SQL查询语句
        ResultSet rs = ps.executeQuery();//查询结果集
        System.out.println(" 学号\t id\t  \t姓名\t  性别\t    生日\t\t学分");
        while(rs.next()) {//遍历结果集
            //使用ResultSet的get方法获取集合中的值，参数为数据库中的字段名
            System.out.println(rs.getString("studentID")+"\t"
                    +rs.getString("id")+"\t"
                    +rs.getString("studentName")+"\t  "
                    +rs.getString("studentSex")+"\t  "
                    +rs.getString("studentBirthday")+"\t"
                    +rs.getString("credit")+"\t");
        }
    }

    // 查询单个学生
    public void Select(String name) throws SQLException, ClassNotFoundException {
        Connection con = getConnection();//调用getConnection()方法获取数据库连接对象
        PreparedStatement ps = con.prepareStatement("select * from student where studentName="+"'"+name+"'");
        ResultSet rs = ps.executeQuery();
        System.out.println(" 学号\t id\t  \t姓名\t  性别\t    生日\t\t学分");
        while(rs.next()) {
            System.out.println(rs.getString("studentID")+"\t"
                    +rs.getString("id")+"\t"
                    +rs.getString("studentName")+"\t  "
                    +rs.getString("studentSex")+"\t  "
                    +rs.getString("studentBirthday")+"\t"
                    +rs.getString("credit")+"\t");
        }



    }


    // 插入学生数据
    public int insertStudent(int num) throws ClassNotFoundException, SQLException {
        Connection con = getConnection();
        String sql = "insert into student values(null,?,?,?,?,0,'202105')";//定义SQl语句，班级编号和学分不需手动插入。
        PreparedStatement ps = con.prepareStatement(sql);//执行SQL语句
        Scanner sc = new Scanner(System.in);
        int count=0;//定义变量保存修改的行数
        for(int i=1;i<=num;i++) {
            System.out.println("请输入第"+i+"个学生的学号：");
            String ID = sc.next();
            System.out.println("请输入第"+i+"个学生的姓名：");
            String name = sc.next();
            System.out.println("请输入第"+i+"个学生的性别：");
            String sex = sc.next();
            System.out.println("请输入第"+i+"个学生的生日：");
            String birthday = sc.next();
            //将输入的值传入，执行SQL，添加数据
            ps.setString(1, ID);
            ps.setString(2, name);
            ps.setString(3, sex);
            ps.setString(4, birthday);
            //executeUpdate()方法的返回值为受影响的行数(插入的数据行数),如果返回值为1，则表示数据插入成功(一次循环执行一次插入)
            if(ps.executeUpdate()==1) {//
                count++;//插入成功，将count值加一
            }else {
                System.out.println("数据插入失败。");
                break;
            }
        }
        return count;//返回受影响的行数
    }


    // 修改学生信息
    public int updateStudent(String ID) throws ClassNotFoundException, SQLException {
        Connection con = getConnection();
        String sql="update student set studentName=?,studentSex=?,studentBirthday=? where studentID="+ID;
        //定义SQL语句修改信息，允许修改的字段值为姓名、性别、出生日期，学号不允许修改。
        PreparedStatement ps = con.prepareStatement(sql);
        Scanner sc = new Scanner(System.in);
        int count=0;
        System.out.println("请输入学生的姓名：");
        String name = sc.next();
        System.out.println("请输入学生的性别：");
        String sex = sc.next();
        System.out.println("请输入学生的生日：");
        String birthday = sc.next();
        ps.setString(1, name);
        ps.setString(2, sex);
        ps.setString(3, birthday);
        count = ps.executeUpdate();
        return count;//返回受影响的行数
    }



    // 删除学生信息
    public int deleteStudentByID(String ID) throws ClassNotFoundException, SQLException {
        Connection con = getConnection();
        Scanner sc = new Scanner(System.in);
        PreparedStatement psS = con.prepareStatement("select * from student where studentID="+ID);
        ResultSet rs = psS.executeQuery();
        //根据学号查询需要删除的学生的信息
        System.out.println("即将删除的学生的信息：");
        System.out.println("  学号\t\t姓名\t  性别\t    生日\t\t学分");
        while(rs.next()) {
            System.out.println(rs.getString("studentID")+"\t"
                    +rs.getString("studentName")+"\t  "
                    +rs.getString("studentSex")+"\t  "
                    +rs.getString("studentBirthday")+"\t"
                    +rs.getString("credit")+"\t");
        }
        System.out.println("请确认信息是否无误（y/Y）？");
        char ch1 = sc.next().charAt(0);
        //
        if(ch1=='Y'||ch1=='y') {
            System.out.println("请确认是否删除（y/Y）?");
            char ch2 = sc.next().charAt(0);
            if(ch2=='y'||ch2=='Y') {//确认删除后，执行删除操作
                PreparedStatement psD = con.prepareStatement("delete from student where studentID="+ID);
                int  count  = psD.executeUpdate();
                return count;//返回受影响的行数
            }else {
                System.out.println("删除取消。");
                return 0;
            }
        }else {
            System.out.println("信息有误，请重新选择......");
            return -1;
        }

    }



}



